#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>


//练习1：求下列程序的输出结果
// 
//int main()
//{
	//char a = 5;

	//5是一个整数，要放在字符型数据a里必须通过两步，
	//1^、写出5这个整型数据的补码，即00000000 00000000 00000000 00000101
	//2^、只取上述补码的从低到高数第八位以后的数据给a这个字符型数据,即执行a = 00000101
	
	//char b = 126;

	//和5一样，1^、写出补码00000000 00000000 00000000 01111110
	//2^、执行b = 01111110

	//char c = a + b;

	//加+这个操作符只能对整型进行相加，
	// 对于两端如果存在字符型数据的情况
	//要进行3步，1、整型提升：将两端的字符型的8位二进制数，
	// 按最高位作为符号位补充
	//符号位补充的意思是将整形数据中超出8位二进制数的
	//那24位全部补充为8位二进制数的最高位，得到的结果就是一个整型数据的32位补码
	//此时就是将a对应的00000101 提升为00000000 00000000 00000000 00000101
	//此时就是将b对应的01111110 提升为00000000 00000000 00000000 01111110
	//2、将1中的两个32位整形数据进行相加得00000000 00000000 00000000 10000011
	//3、执行1^和2^,执行c = 10000011
	
	//printf("%d\n", c);

	//c要按照整型数据打印，执行上述1，得
	//11111111 11111111 11111111 10000011，这是补码
	//人要算其对应的十进制数，要执行逆过程，先减一再出符号位以外按位取反
	//得其十进制数为10000000 00000000 00000000 01111101，则打印-125

//	return 0;//
//}
//字符型、无符号整型、整型都是存储ASCII码值，都是以补码的形式存储


//练习2：求下列程序的打印结果
//int main()
//{
//	char a = 0xb6;
//	short b = 0xb600;
//	int c = 0xb6000000;
//	if (a == 0xb6)
//	{
//		printf("a ");
//	}
//	if (b == 0xb600)
//	{
//		printf("b ");
//	}
//	if (c == 0xb6000000)
//	{
//		printf("c ");
//	}
//	char d = 1;
//	printf("%u ", sizeof(d));//
//	printf("%u ", sizeof(+d));//
//	return 0;//
//}
//程序打印的结果是： c 1 4


//练习3：说明下列程序是错的
//int main()
//{
//	int a = 1;//
//	int b = (++a) + (++a) + (++a);
	//这个代码再编译的时候会有多种可能，所以是错误的
	//第一种可能：先执行三次 ++a操作，a变成4以后，再把三个4加起来，b得到12
	//第二种可能：先执行前两个 ++a操作,a变成3以后,
	// 先把前两个括号的结果加起来，得到6
	//再执行最后一个 ++a，得到4，最后再把6和4加起来，b得到10
	//还有其他可能
//	printf("%d\n", b);//
//	return 0;//
//}
//所以当一个表达式如果不能通过操作符的优先级和结合性确定唯一的计算路径，
//那这个表达式是错误的


//练习4：
//小乐乐上课需要走n阶台阶，因为他腿比较长，所以每次可以选择走一阶或者走两阶，
//那么他一共有多少种走法？
//int fib(int n)
//{
//	if (n == 1)
//	{
//		return 1;//
//	}
//	else if (n == 2)
//	{
//		return 2;//
//	}
//	else
//	{
//		return fib(n - 1) + fib(n - 2);
//	}
//}

// n(4)
// n(3)     + n(2)
// n(2) + 1 + n(2)
// 2    + 1 + 2

//int main()
//{
//	int n = 0;//
//	scanf("%d", &n);//
//	int m = fib(n);//
//	printf("%d\n", m);//
//	return 0;//
//}

//练习5：
//有一个整数序列（可能有重复的整数），现删除指定的某个整数，输出删除指定数字之后的序列
//序列中未被删除数字的前后位置没有发生改变。
//输入要求 :
//第一行输入一个整数N(0 < N < 50)
//	第二行输入N个整数，输入用空格分隔的N个整数
//	第三行输入想要删除的一个整数
//	输出要求：
//	输出为一行，删除指定数字后的序列
//int main()
//{
//	int n = 0;//
//	scanf("%d\n", &n);
//	//假设输入的n等于6
//	int arr[50];//
//	int i = 0;//
//	for (i = 0; i < n; i++)
//	{
//		scanf("%d", &arr[i]);//
//	}
//	int del = 0;
//	//假设输入的del等于2
//	scanf("%d", &del);//
//	int j = 0;//
//	for (i = 0; i < n; i++)
//	{
//		if (arr[i] != del)
//		{
//			arr[j] = arr[i];//
//			j++;//
//		}
//	}
//	//比如数组中的元素是1 3 2 4 2 5，上述最后一个for循环实现的功能是
//    //一开始i和j都指向1，判断arr [0]不等于del，
//    // 则将arr [0] 付给现在的arr [j]，其中j = 0
//    //然后执行j++，i++，指向3，判断arr[1]不等于del，
//    // 则将arr[1] 赋给现在的arr[j]，其中j = 1
//    //然后执行j++，i++，指向2，判断arr[2]等于del，
//    // 跳过循环体，j等于2
//    //然后执行i++，     指向4，判断arr[3]不等于del，
//    // 则将arr[3] 赋给现在的arr[j]，其中j = 2
//    //然后执行j++，i++，指向2，判断arr[4]等于del，
//    // 跳过循环体，j等于3
//    //然后执行i++，     指向5，判断arr[5]不等于del，
//    // 则将arr[5] 赋给现在的arr[j]，其中j = 3
//    //然后执行j++，i++，其中j = 4，i = 6，for的判断语句不满足，结束循环
//	for (i = 0; i < j; i++)
//	{
//		printf("%d  ", arr[i]);//
//	}
//
//	return 0;//
//}

//练习6：
//输入n个成绩，换行输出n个成绩中最高分数和最低分数的差
//输入要求：
//两行，第一行为n，表示代表有n个人的成绩，不会大于10000
//第二行为成绩的值，成绩再0到100内
//输出要求：
//一行，输出n个成绩中最高分数和最低分数的差

//int main()
//{
//	int n = 0;//
//	scanf("%d", &n);//
//	int arr[10000];
//	int i = 0;//
//	for (i = 0; i < n; i++)
//	{
//		scanf("%d", &arr[i]);//
//	}
//	int max = arr[0];//
//	int min = arr[0];//
//	for (i = 1; i < n; i++)
//	{
//		if (arr[i] > max)
//		{
//			max = arr[i];//
//		}
//		if (arr[i] < min)
//		{
//			min = arr[i];//
//		}
//	}
//	printf("%d\n", max - min);//
//	return 0;//
//}
//
// 或者也可以使用下面的程序
//int main()
//{
//	int n = 0;//
//	scanf("%d", &n);//
//	int arr[10000];
//	int i = 0;//
//	int max = 0;//
//	int min = 100;//
//	for (i = 0; i < n; i++)
//	{
//		scanf("%d", &arr[i]);//
//		if (arr[i] > max)
//		{
//			max = arr[i];//
//		}
//		if (arr[i] < min)
//		{
//			min = arr[i];//
//		}
//	}
//	printf("%d\n", max - min);//
//	return 0;//
//}


//练习7：
//有一个字符，判断它是否为大写字母，如果是，将它转换成小写字母；
//如果不是，则转换成大写字母
//输入要求
//多组输入，每行输入一个字母
//输出要求
//针对每组的输入，输出单独占一行，输出字母的对应形式

//int main()
//{
//	char ch = 0;//
//	while (scanf("%c", &ch) != EOF)
//	//scanf如果接收到n个字符则返回值为n,
//	//scanf读取失败时，则返回值为EOF
//	{
//		if (ch >= 'a' && ch <= 'z')
//		{
//			printf("%c\n", ch - 32);//
//		}
//		else if (ch >= 'A' && ch <= 'Z')
//		{
//			printf("%c\n", ch + 32);//
//		}
//	}
//	return 0;
//}

//练习8：
//输入要求：
//多组输入，每一行输入一个字符
//输出要求：
//针对每组输入，输出单独占一行，判断输入字符是否为字母
//例如输入为：A \n 6，则输出为：A is an alphabet \n 6 is not an alphabet
//int main()
//{
//	char ch = 0;//
//	while (scanf("%c", &ch) != EOF)
//	{
//		if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
//		{
//			printf("%c is an alphabet\n", ch);//
//		}
//		else
//		{
//			printf("%c is not an alphabet\n", ch);// 
//		}
//		getchar();//从缓存区把\n 这个字符拿走
//	}
//	return 0;//
//}

//练习9：
//判断三科的最高分
//输入要求：
//输入一行包括三个整数表示的分数(0~100), 用空格分隔
//输出要求：
//输出一行，即三个分数中的最高分
//int main()
//{
//	int i = 0;//
//	int max = 0;//
//	int n = 0;//
//	for (i = 0; i < 3; i++)
//	{
//		scanf("%d", &n);//
//		if (n > max)
//		{
//			max = n;//
//		}
//	}
//	printf("%d", max);//
//	return 0;//
//}

//练习10：
//输出要求：
//5位数中的所有lil数，lil数的定义：
// 把任意的数字，从中间拆分成两个数字，比如1461可拆成三组数，
//(1和461), (14和61), (146和1)，
// 如果拆分后的乘积之和等于自身，则是一个lil数
//如1461 = 1 * 461 + 14 * 61 + 146 * 1

#include <math.h>
// int main()
// {
// 	int i = 0;//
// 	//sum的创建不能在外面
// 	for (i = 100; i <= 999; i++)
// 	{
// 		int j = 0;//
// 		int sum = 0;
// 		for (j = 1; j <= 2; j++)
// 		{
// 			int t = (int)pow(10, j);//
// 			sum = sum + ((i / t) * (i % t));
// 		}
// 		if (sum == i)
// 		{
// 			printf("%d ", i);//
// 		}
// 	}
// 	return 0;//
// }

//也可以用下面的程序
int main()
{
	int i = 0;
	for ( i = 1000; i < 9999; i++)
	{
		int tmp = i;
		int j = 1;
		int sum = 0;
		while (tmp > 9)
		{
			tmp /= 10;
			sum += tmp* (i % (int)pow(10, j++));
		}
		if (sum == i)
		{
			printf("%d ", sum);
		}
	}

	return 0;
}